home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / bin / pysupport-movemodules < prev    next >
Encoding:
Text File  |  2009-04-09  |  4.8 KB  |  144 lines

  1. #! /usr/bin/python
  2. #
  3. # copyright (c) 2006 Josselin Mouette <joss@debian.org>
  4. # Licensed under the GNU Lesser General Public License, version 2.1
  5. # See COPYING for details
  6.  
  7. from optparse import OptionParser
  8. import os,os.path,re,sys
  9. from hashlib import md5
  10.  
  11. sourcepath='usr/share/python-support'
  12. extensionpath='usr/lib/python-support'
  13.  
  14. parser = OptionParser(usage="usage: %prog [options] [directory [...]]")
  15.  
  16. parser.add_option("-v", "--verbose", action="store_true", dest="verbose",
  17.                   help="verbose output", default=False)
  18. parser.add_option("-p", "--package", dest="package")
  19.  
  20. (options, args) = parser.parse_args()
  21.  
  22. sys.path.append("/usr/lib/python-support/private/")
  23. from pysupport import py_supported,py_supported_short
  24.  
  25. # Set the umask so that directories are created with correct permissions
  26. os.umask(022)
  27.  
  28. if not args:
  29.   parser.error("No directory to process.")
  30.  
  31. for basedir in args:
  32.   if not os.path.isdir(basedir):
  33.     parser.error("%s is not a directory."%basedir)
  34.  
  35. class filelist:
  36.   def __init__(self):
  37.     self.d={}
  38.     self.pylist=[]
  39.   def addsum(self,file,pyver,sum):
  40.     if file not in self.d:
  41.       self.d[file]={}
  42.     self.d[file][pyver]=sum
  43.   def addpyver(self,pyver):
  44.     self.pylist.append(pyver)
  45.   def isallthesame(self,file):
  46.     if file.endswith(".so"):
  47.       # If there is a .so, no need to even check, it must be moved
  48.       return False
  49.     elif re.search('\.so(?:\.\d+){0,3}$', file):
  50.       print "%s: this shared object should not be versioned"%file
  51.       return False
  52.     try:
  53.       s=[ self.d[file][pyver] for pyver in self.pylist ]
  54.     except KeyError:
  55.       return False
  56.     return (s.count(s[0]) == len(self.pylist))
  57.   def list(self,file):
  58.     return self.d[file].keys()
  59.   def __iter__(self):
  60.     return iter(self.d)
  61.  
  62. def do_move (basedir, package, pybasedir, suffixdir=""):
  63.   file_dict=filelist()
  64.   for pyvers in py_supported:
  65.     pydir=os.path.join(basedir,pybasedir,pyvers,suffixdir)
  66.     if not os.path.isdir(pydir):
  67.       continue
  68.     file_dict.addpyver(pyvers)
  69.     for dir, dirs, files in os.walk(pydir):
  70.       reldir = dir[len(pydir):].lstrip('/')
  71.       for curfile in files:
  72.         relfile = os.path.join(reldir,curfile)
  73.         absfile = os.path.join(pydir,relfile)
  74.         # remove bytecompiled files and libtool cruft
  75.         if relfile.split('.')[-1] in ["pyc", "pyo", "a", "la"]:
  76.           os.remove(absfile)
  77.         else:
  78.           file_dict.addsum(relfile,pyvers,md5(file(absfile).read()).digest())
  79.  
  80.   for relfile in file_dict:
  81.     splitfile=not file_dict.isallthesame(relfile)
  82.     destdir=os.path.join(sourcepath,package)
  83.     for pyver in file_dict.list(relfile):
  84.       sourcefile=os.path.join(basedir,pybasedir,pyver,suffixdir,relfile)
  85.       if splitfile:
  86.         destdir=os.path.join(extensionpath,package,pyver)
  87.       os.renames(sourcefile,os.path.join(basedir,destdir,relfile))
  88.  
  89. # Remove the -py$(VERSION) part of the egg directories
  90. def do_eggrename (basedir, package, pybasedir, suffixdir=""):
  91.   for vers in py_supported_short:
  92.     pydir=os.path.join(basedir,pybasedir,"python"+vers,suffixdir)
  93.     suffix="-py"+vers+".egg-info"
  94.     if not os.path.isdir(pydir):
  95.       continue
  96.     for item in os.listdir(pydir):
  97.       item=os.path.join(pydir,item)
  98.       if os.path.isdir(item) and item.endswith(suffix):
  99.        new_item = item[:-len(suffix)]+".egg-info"
  100.        if not os.path.exists(new_item): # You never know
  101.          os.rename(item, new_item)
  102.  
  103. def move_sitedirs(basedir, package):
  104.   import shutil, subprocess
  105.   for pyvers in py_supported:
  106.     destdir = os.path.join(basedir,'usr/lib',pyvers,'site-packages')
  107.     for pybasedir in ('usr/lib', 'usr/local/lib'):
  108.       sitedir = os.path.join(basedir,pybasedir,pyvers,'dist-packages')
  109.       if os.path.isdir(sitedir):
  110.         try:
  111.           os.makedirs(destdir)
  112.         except OSError:
  113.           pass
  114.         rv = subprocess.call(['tar -c -f - -C ' + sitedir + ' . | tar -x -f - -C '+ destdir], shell=True)
  115.         if rv != 0:
  116.           sys.exit(1)
  117.         shutil.rmtree(sitedir)
  118.         while sitedir:
  119.           sitedir=os.path.dirname(sitedir)
  120.           try:
  121.             os.rmdir(sitedir)
  122.           except OSError:
  123.             break
  124.  
  125. first_dir=True
  126. for basedir in args:
  127.   basedir=basedir.rstrip('/')
  128.   package=options.package
  129.   if not package:
  130.     package=os.path.split(basedir)[1]
  131.   if not package:
  132.     raise "Unable to extract the package name."
  133.   if first_dir:
  134.     move_sitedirs(basedir, package)
  135.     first_dir = False
  136.   do_eggrename (basedir, package, "usr/lib", "site-packages")
  137.   do_move (basedir, package, "usr/lib", "site-packages")
  138.   do_eggrename (basedir, package, "var/lib/python-support")
  139.   do_move (basedir, package, "var/lib/python-support")
  140.  
  141.   # Handle the case when there are only .so files
  142.   if os.path.isdir(os.path.join(basedir,extensionpath)) and not os.path.isdir(os.path.join(basedir,sourcepath,package)):
  143.     os.makedirs(os.path.join(basedir,sourcepath,package))
  144.